'use strict';
// +----------------------------------------------------------------------
// | CmPage [ 通用页面框架 ]
// +----------------------------------------------------------------------
// | Licensed under the Apache License, Version 2.0
// +----------------------------------------------------------------------
// | Author: defans <defans@sina.cn>
// +----------------------------------------------------------------------
/**
 @module admin.model
 */

/**
 * 登录用户的操作类，提供一些操作t_user,vw_user的方法
 * @class admin.model.user
 */
import CMPage from '../../cmpage/model/page.js';

export default class extends CMPage {
    /**
     * 重写父类的 getQueryWhere 方法，增加页面模块的条件设置，组合成新的Where子句, c_linktype==1表示关联的是集团用户: c_link = t_emp.id
     * @method  getQueryWhere
     * @return {string}  where条件子句
     * @param {Object} page  页面设置主信息
     */
    async getQueryWhere(){
        let where =await super.getQueryWhere();
        //cmpage.debug(where);
        return where +' and c_status<>-1 and c_linktype=1';
    }
    /**
     * 重写父类的 pageSave 方法，保存参数后清除user的缓存
     * @method  pageSave
     * @return {Object}  保存的数据表记录的对象
     * @param {Object} page  页面设置主信息
     * @param {Object} parms  编辑页面传回的FORM参数
     */
    async pageSave(parms){
        //先保存t_emp
        let md =cmpage.objPropertysFromOtherObj({},parms,['c_name','c_sex','c_phone','c_email','c_qq','c_address','c_memo','c_birthday','c_dept',
            'c_user','c_time','c_group','c_province','c_city','c_country','c_manager']);
        //checkbox类型的值为false时，前端不传值，因此特殊处理
        md.c_sex = think.isEmpty(md.c_sex) ? false: md.c_sex;
        let userMd = { c_role:parms.c_role, c_login_name:parms.c_login_name, c_linktype:1, c_status:0 };
        if(parms.id ==0 ){
            md.id = await this.model('t_emp').add(cmpage.checksql(md));
            userMd.c_link = md.id;
            userMd.c_login_pwd = think.md5('123456');
            userMd.c_guid =think.uuid(32);
            userMd.c_status = cmpage.enumUserStatus.NORMAL;
            userMd.id = await this.model('t_user').add(cmpage.checksql(userMd));
        }else {
            console.log(md);
            await this.model('t_emp').where({id:parms.c_link}).update(cmpage.checksql(md));
            await this.model('t_user').where({id:parms.id}).update(cmpage.checksql(userMd));
            userMd.id = parms.id;
        }

        await think.cache("users",null);  //清除users缓存
        return userMd;
    }

    /**
     * 初始化用户密码
     * @method  initUserPwd
     * @return {object}  用户对象
     * @param {int} userID 用户ID
     */
    async initUserPwd(userID){
        let user = await this.getUserById(userID);
        if(think.config().ssuser_use){
            //更新用户中心密码
            let ret = await cmpage.model('admin/ssuser').initUserPwd( user.c_guid );
            if(ret.statusCode == 200 ){
                await this.model('t_user').where({id:userID}).update({c_login_pwd:ret.login_pwd});
                think.cache("users", null);
            }else if(ret.statusCode == 302){
                //如果不存在，则增加用户
                let loginPwd = think.md5('123456');
                let ssuser = await cmpage.model('admin/ssuser').addUser({login_name:user.c_login_name, login_pwd:loginPwd, name:user.c_name, phone:user.c_phone});
                debug(ssuser,'admin.user.initUserPwd - addUser.result');
                await this.model('t_user').where({id:userID}).update({c_guid:ssuser.data.c_guid, c_login_pwd:loginPwd});
                think.cache("users", null);
            }

            return  ret;
        }else{
            user.login_pwd = think.md5('123456');
            await this.model('t_user').where({id:userID}).update({c_login_pwd:user.login_pwd});
            return {statusCode:200, message:'', data:user}
        }

    }

    /**
     * 修改用户密码
     * @method  updateUserPwd
     * @return {object}  用户对象
     * @param {int} userID 用户ID
     * @param {string} oldPwd 旧密码，用于验证
     * @param {string} newPwd 新密码
     */
    async updateUserPwd(userID, oldPwd, newPwd){
        let user = await this.getUserById(userID);
        let parms = {guid:user.c_guid, old_pwd:oldPwd, new_pwd:newPwd};
        if(think.config().ssuser_use){
            //更新用户中心密码
            let ret = await cmapge.model('admin/ssuser').updateUserPwd( parms );
            if(ret.statusCode == 200){
                await this.model('t_user').where({id:userID}).update({c_login_pwd:newPwd});
                think.cache("users", null);
            }
            return  ret;
        }else{
            if(user.c_login_pwd != oldPwd){
                return {statusCode:300, message:'旧密码输入错误!', data:parms }
            }
            await this.model('t_user').where({id:userID}).update({c_login_pwd:newPwd});
            return {statusCode:200, message:'', data:parms };
        }
    }

    /**
     * 修改用户资料
     * @method  updateUser
     * @return {object}  状态对象
     * @param {int} userID 用户ID
     * @param {object} user 需要修改的用户信息
     */
    async updateUser(userID,user){
        await this.model('t_user').where({id:userID}).update(user);
        user.id = userID;
        return  {statusCode:200, message:'', data:user};
    }

    /**
     * 根据用户ID取用户名称，一般用于页面模块配置中的‘替换’调用: admin/user:getNameById
     * @method  getNameById
     * @return {string}  用户名称
     * @param {int} id  用户ID
     */
    async getNameById(id){
        let users =await this.getUsers();
        for(let user of users){
            if(user.id == id){
                return user.c_name;
            }
        }
        return '';
    }

    /**
     * 根据用户ID取用户对象
     * @method  getNameById
     * @return {object}  用户对象
     * @param {int} id  用户ID
     */
    async getUserById(id){
        let users =await this.getUsers();
        for(let user of users){
            if(user.id == id){
                return user;
            }
        }
        return {};
    }
    /**
     * 根据用户登录名和密码取用户记录对象，
     * @method  getUserByLogin
     * @return {object}  用户信息
     * @param {string} loginName  登录名
     * @param {string} loginPwd  登录密码
     * @param {bool} isMd5  是否是MD5加密过的
     */
    async getUserByLogin(loginName,loginPwd, isMd5){
        let users =await this.getUsers();
        let pwd = isMd5 ? loginPwd : think.md5(loginPwd)
        //cmpage.debug(users);
        for(let user of users){
            if(user.c_login_name == loginName && user.c_login_pwd == pwd){
                return user;
            }
        }
        return {};
    }

    /**
     * 取vw_user的记录，缓存， 按名称排序
     * @method  getUsers
     * @return {Array}  vw_user记录列表
     */
    async getUsers(){
        return await think.cache("users", () => {
            //return this.model('vw_user').order('c_name').select();
            return this.query('select * from vw_user order by  c_name ');
        });
    }


}
